{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "from dataclasses import dataclass\n",
    "import torch\n",
    "import warnings\n",
    "from utils import get_save_path\n",
    "warnings.filterwarnings(\"ignore\")\n",
    "%matplotlib inline\n",
    "@dataclass\n",
    "class TrainingConfig:\n",
    "    image_size = 28  # the generated image resolution\n",
    "    train_batch_size = 16\n",
    "    eval_batch_size = 16  # how many images to sample during evaluation\n",
    "    optimizer = torch.optim.SGD\n",
    "    num_epochs = 10\n",
    "    learning_rate = 1e-4\n",
    "    mixed_precision = 'fp16'  # `no` for float32, `fp16` for automatic mixed precision\n",
    "    output_dir = 'cls'  # the model namy locally and on the HF Hub\n",
    "    seed = 0\n",
    "config = TrainingConfig()\n",
    "config.output_dir = get_save_path(config.output_dir)\n",
    "config.index2label={\n",
    "    0:0, 1:1, 2:2, 3:3, 4:4, 5:5, 6:6, 7:7, 8:8, 9:9\n",
    "}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "----------------------------------------------------------------\n",
      "        Layer (type)               Output Shape         Param #\n",
      "================================================================\n",
      "            Conv2d-1           [-1, 64, 14, 14]           3,136\n",
      "       BatchNorm2d-2           [-1, 64, 14, 14]             128\n",
      "              ReLU-3           [-1, 64, 14, 14]               0\n",
      "          BaseConv-4           [-1, 64, 14, 14]               0\n",
      "         MaxPool2d-5             [-1, 64, 7, 7]               0\n",
      "            Conv2d-6             [-1, 64, 7, 7]           4,096\n",
      "       BatchNorm2d-7             [-1, 64, 7, 7]             128\n",
      "          BaseConv-8             [-1, 64, 7, 7]               0\n",
      "              ReLU-9             [-1, 64, 7, 7]               0\n",
      "           Conv2d-10             [-1, 64, 7, 7]          36,864\n",
      "      BatchNorm2d-11             [-1, 64, 7, 7]             128\n",
      "         BaseConv-12             [-1, 64, 7, 7]               0\n",
      "             ReLU-13             [-1, 64, 7, 7]               0\n",
      "           Conv2d-14            [-1, 256, 7, 7]          16,384\n",
      "      BatchNorm2d-15            [-1, 256, 7, 7]             512\n",
      "         BaseConv-16            [-1, 256, 7, 7]               0\n",
      "           Conv2d-17            [-1, 256, 7, 7]          16,384\n",
      "      BatchNorm2d-18            [-1, 256, 7, 7]             512\n",
      "         BaseConv-19            [-1, 256, 7, 7]               0\n",
      "             ReLU-20            [-1, 256, 7, 7]               0\n",
      "       Bottleneck-21            [-1, 256, 7, 7]               0\n",
      "           Conv2d-22             [-1, 64, 7, 7]          16,384\n",
      "      BatchNorm2d-23             [-1, 64, 7, 7]             128\n",
      "         BaseConv-24             [-1, 64, 7, 7]               0\n",
      "             ReLU-25             [-1, 64, 7, 7]               0\n",
      "           Conv2d-26             [-1, 64, 7, 7]          36,864\n",
      "      BatchNorm2d-27             [-1, 64, 7, 7]             128\n",
      "         BaseConv-28             [-1, 64, 7, 7]               0\n",
      "             ReLU-29             [-1, 64, 7, 7]               0\n",
      "           Conv2d-30            [-1, 256, 7, 7]          16,384\n",
      "      BatchNorm2d-31            [-1, 256, 7, 7]             512\n",
      "         BaseConv-32            [-1, 256, 7, 7]               0\n",
      "             ReLU-33            [-1, 256, 7, 7]               0\n",
      "       Bottleneck-34            [-1, 256, 7, 7]               0\n",
      "           Conv2d-35             [-1, 64, 7, 7]          16,384\n",
      "      BatchNorm2d-36             [-1, 64, 7, 7]             128\n",
      "         BaseConv-37             [-1, 64, 7, 7]               0\n",
      "             ReLU-38             [-1, 64, 7, 7]               0\n",
      "           Conv2d-39             [-1, 64, 7, 7]          36,864\n",
      "      BatchNorm2d-40             [-1, 64, 7, 7]             128\n",
      "         BaseConv-41             [-1, 64, 7, 7]               0\n",
      "             ReLU-42             [-1, 64, 7, 7]               0\n",
      "           Conv2d-43            [-1, 256, 7, 7]          16,384\n",
      "      BatchNorm2d-44            [-1, 256, 7, 7]             512\n",
      "         BaseConv-45            [-1, 256, 7, 7]               0\n",
      "             ReLU-46            [-1, 256, 7, 7]               0\n",
      "       Bottleneck-47            [-1, 256, 7, 7]               0\n",
      "           Conv2d-48            [-1, 128, 7, 7]          32,768\n",
      "      BatchNorm2d-49            [-1, 128, 7, 7]             256\n",
      "         BaseConv-50            [-1, 128, 7, 7]               0\n",
      "             ReLU-51            [-1, 128, 7, 7]               0\n",
      "           Conv2d-52            [-1, 128, 4, 4]         147,456\n",
      "      BatchNorm2d-53            [-1, 128, 4, 4]             256\n",
      "         BaseConv-54            [-1, 128, 4, 4]               0\n",
      "             ReLU-55            [-1, 128, 4, 4]               0\n",
      "           Conv2d-56            [-1, 512, 4, 4]          65,536\n",
      "      BatchNorm2d-57            [-1, 512, 4, 4]           1,024\n",
      "         BaseConv-58            [-1, 512, 4, 4]               0\n",
      "           Conv2d-59            [-1, 512, 4, 4]         131,072\n",
      "      BatchNorm2d-60            [-1, 512, 4, 4]           1,024\n",
      "         BaseConv-61            [-1, 512, 4, 4]               0\n",
      "             ReLU-62            [-1, 512, 4, 4]               0\n",
      "       Bottleneck-63            [-1, 512, 4, 4]               0\n",
      "           Conv2d-64            [-1, 128, 4, 4]          65,536\n",
      "      BatchNorm2d-65            [-1, 128, 4, 4]             256\n",
      "         BaseConv-66            [-1, 128, 4, 4]               0\n",
      "             ReLU-67            [-1, 128, 4, 4]               0\n",
      "           Conv2d-68            [-1, 128, 4, 4]         147,456\n",
      "      BatchNorm2d-69            [-1, 128, 4, 4]             256\n",
      "         BaseConv-70            [-1, 128, 4, 4]               0\n",
      "             ReLU-71            [-1, 128, 4, 4]               0\n",
      "           Conv2d-72            [-1, 512, 4, 4]          65,536\n",
      "      BatchNorm2d-73            [-1, 512, 4, 4]           1,024\n",
      "         BaseConv-74            [-1, 512, 4, 4]               0\n",
      "             ReLU-75            [-1, 512, 4, 4]               0\n",
      "       Bottleneck-76            [-1, 512, 4, 4]               0\n",
      "           Conv2d-77            [-1, 128, 4, 4]          65,536\n",
      "      BatchNorm2d-78            [-1, 128, 4, 4]             256\n",
      "         BaseConv-79            [-1, 128, 4, 4]               0\n",
      "             ReLU-80            [-1, 128, 4, 4]               0\n",
      "           Conv2d-81            [-1, 128, 4, 4]         147,456\n",
      "      BatchNorm2d-82            [-1, 128, 4, 4]             256\n",
      "         BaseConv-83            [-1, 128, 4, 4]               0\n",
      "             ReLU-84            [-1, 128, 4, 4]               0\n",
      "           Conv2d-85            [-1, 512, 4, 4]          65,536\n",
      "      BatchNorm2d-86            [-1, 512, 4, 4]           1,024\n",
      "         BaseConv-87            [-1, 512, 4, 4]               0\n",
      "             ReLU-88            [-1, 512, 4, 4]               0\n",
      "       Bottleneck-89            [-1, 512, 4, 4]               0\n",
      "           Conv2d-90            [-1, 128, 4, 4]          65,536\n",
      "      BatchNorm2d-91            [-1, 128, 4, 4]             256\n",
      "         BaseConv-92            [-1, 128, 4, 4]               0\n",
      "             ReLU-93            [-1, 128, 4, 4]               0\n",
      "           Conv2d-94            [-1, 128, 4, 4]         147,456\n",
      "      BatchNorm2d-95            [-1, 128, 4, 4]             256\n",
      "         BaseConv-96            [-1, 128, 4, 4]               0\n",
      "             ReLU-97            [-1, 128, 4, 4]               0\n",
      "           Conv2d-98            [-1, 512, 4, 4]          65,536\n",
      "      BatchNorm2d-99            [-1, 512, 4, 4]           1,024\n",
      "        BaseConv-100            [-1, 512, 4, 4]               0\n",
      "            ReLU-101            [-1, 512, 4, 4]               0\n",
      "      Bottleneck-102            [-1, 512, 4, 4]               0\n",
      "          Conv2d-103            [-1, 256, 4, 4]         131,072\n",
      "     BatchNorm2d-104            [-1, 256, 4, 4]             512\n",
      "        BaseConv-105            [-1, 256, 4, 4]               0\n",
      "            ReLU-106            [-1, 256, 4, 4]               0\n",
      "          Conv2d-107            [-1, 256, 2, 2]         589,824\n",
      "     BatchNorm2d-108            [-1, 256, 2, 2]             512\n",
      "        BaseConv-109            [-1, 256, 2, 2]               0\n",
      "            ReLU-110            [-1, 256, 2, 2]               0\n",
      "          Conv2d-111           [-1, 1024, 2, 2]         262,144\n",
      "     BatchNorm2d-112           [-1, 1024, 2, 2]           2,048\n",
      "        BaseConv-113           [-1, 1024, 2, 2]               0\n",
      "          Conv2d-114           [-1, 1024, 2, 2]         524,288\n",
      "     BatchNorm2d-115           [-1, 1024, 2, 2]           2,048\n",
      "        BaseConv-116           [-1, 1024, 2, 2]               0\n",
      "            ReLU-117           [-1, 1024, 2, 2]               0\n",
      "      Bottleneck-118           [-1, 1024, 2, 2]               0\n",
      "          Conv2d-119            [-1, 256, 2, 2]         262,144\n",
      "     BatchNorm2d-120            [-1, 256, 2, 2]             512\n",
      "        BaseConv-121            [-1, 256, 2, 2]               0\n",
      "            ReLU-122            [-1, 256, 2, 2]               0\n",
      "          Conv2d-123            [-1, 256, 2, 2]         589,824\n",
      "     BatchNorm2d-124            [-1, 256, 2, 2]             512\n",
      "        BaseConv-125            [-1, 256, 2, 2]               0\n",
      "            ReLU-126            [-1, 256, 2, 2]               0\n",
      "          Conv2d-127           [-1, 1024, 2, 2]         262,144\n",
      "     BatchNorm2d-128           [-1, 1024, 2, 2]           2,048\n",
      "        BaseConv-129           [-1, 1024, 2, 2]               0\n",
      "            ReLU-130           [-1, 1024, 2, 2]               0\n",
      "      Bottleneck-131           [-1, 1024, 2, 2]               0\n",
      "          Conv2d-132            [-1, 256, 2, 2]         262,144\n",
      "     BatchNorm2d-133            [-1, 256, 2, 2]             512\n",
      "        BaseConv-134            [-1, 256, 2, 2]               0\n",
      "            ReLU-135            [-1, 256, 2, 2]               0\n",
      "          Conv2d-136            [-1, 256, 2, 2]         589,824\n",
      "     BatchNorm2d-137            [-1, 256, 2, 2]             512\n",
      "        BaseConv-138            [-1, 256, 2, 2]               0\n",
      "            ReLU-139            [-1, 256, 2, 2]               0\n",
      "          Conv2d-140           [-1, 1024, 2, 2]         262,144\n",
      "     BatchNorm2d-141           [-1, 1024, 2, 2]           2,048\n",
      "        BaseConv-142           [-1, 1024, 2, 2]               0\n",
      "            ReLU-143           [-1, 1024, 2, 2]               0\n",
      "      Bottleneck-144           [-1, 1024, 2, 2]               0\n",
      "          Conv2d-145            [-1, 256, 2, 2]         262,144\n",
      "     BatchNorm2d-146            [-1, 256, 2, 2]             512\n",
      "        BaseConv-147            [-1, 256, 2, 2]               0\n",
      "            ReLU-148            [-1, 256, 2, 2]               0\n",
      "          Conv2d-149            [-1, 256, 2, 2]         589,824\n",
      "     BatchNorm2d-150            [-1, 256, 2, 2]             512\n",
      "        BaseConv-151            [-1, 256, 2, 2]               0\n",
      "            ReLU-152            [-1, 256, 2, 2]               0\n",
      "          Conv2d-153           [-1, 1024, 2, 2]         262,144\n",
      "     BatchNorm2d-154           [-1, 1024, 2, 2]           2,048\n",
      "        BaseConv-155           [-1, 1024, 2, 2]               0\n",
      "            ReLU-156           [-1, 1024, 2, 2]               0\n",
      "      Bottleneck-157           [-1, 1024, 2, 2]               0\n",
      "          Conv2d-158            [-1, 256, 2, 2]         262,144\n",
      "     BatchNorm2d-159            [-1, 256, 2, 2]             512\n",
      "        BaseConv-160            [-1, 256, 2, 2]               0\n",
      "            ReLU-161            [-1, 256, 2, 2]               0\n",
      "          Conv2d-162            [-1, 256, 2, 2]         589,824\n",
      "     BatchNorm2d-163            [-1, 256, 2, 2]             512\n",
      "        BaseConv-164            [-1, 256, 2, 2]               0\n",
      "            ReLU-165            [-1, 256, 2, 2]               0\n",
      "          Conv2d-166           [-1, 1024, 2, 2]         262,144\n",
      "     BatchNorm2d-167           [-1, 1024, 2, 2]           2,048\n",
      "        BaseConv-168           [-1, 1024, 2, 2]               0\n",
      "            ReLU-169           [-1, 1024, 2, 2]               0\n",
      "      Bottleneck-170           [-1, 1024, 2, 2]               0\n",
      "          Conv2d-171            [-1, 256, 2, 2]         262,144\n",
      "     BatchNorm2d-172            [-1, 256, 2, 2]             512\n",
      "        BaseConv-173            [-1, 256, 2, 2]               0\n",
      "            ReLU-174            [-1, 256, 2, 2]               0\n",
      "          Conv2d-175            [-1, 256, 2, 2]         589,824\n",
      "     BatchNorm2d-176            [-1, 256, 2, 2]             512\n",
      "        BaseConv-177            [-1, 256, 2, 2]               0\n",
      "            ReLU-178            [-1, 256, 2, 2]               0\n",
      "          Conv2d-179           [-1, 1024, 2, 2]         262,144\n",
      "     BatchNorm2d-180           [-1, 1024, 2, 2]           2,048\n",
      "        BaseConv-181           [-1, 1024, 2, 2]               0\n",
      "            ReLU-182           [-1, 1024, 2, 2]               0\n",
      "      Bottleneck-183           [-1, 1024, 2, 2]               0\n",
      "          Conv2d-184            [-1, 512, 2, 2]         524,288\n",
      "     BatchNorm2d-185            [-1, 512, 2, 2]           1,024\n",
      "        BaseConv-186            [-1, 512, 2, 2]               0\n",
      "            ReLU-187            [-1, 512, 2, 2]               0\n",
      "          Conv2d-188            [-1, 512, 1, 1]       2,359,296\n",
      "     BatchNorm2d-189            [-1, 512, 1, 1]           1,024\n",
      "        BaseConv-190            [-1, 512, 1, 1]               0\n",
      "            ReLU-191            [-1, 512, 1, 1]               0\n",
      "          Conv2d-192           [-1, 2048, 1, 1]       1,048,576\n",
      "     BatchNorm2d-193           [-1, 2048, 1, 1]           4,096\n",
      "        BaseConv-194           [-1, 2048, 1, 1]               0\n",
      "          Conv2d-195           [-1, 2048, 1, 1]       2,097,152\n",
      "     BatchNorm2d-196           [-1, 2048, 1, 1]           4,096\n",
      "        BaseConv-197           [-1, 2048, 1, 1]               0\n",
      "            ReLU-198           [-1, 2048, 1, 1]               0\n",
      "      Bottleneck-199           [-1, 2048, 1, 1]               0\n",
      "          Conv2d-200            [-1, 512, 1, 1]       1,048,576\n",
      "     BatchNorm2d-201            [-1, 512, 1, 1]           1,024\n",
      "        BaseConv-202            [-1, 512, 1, 1]               0\n",
      "            ReLU-203            [-1, 512, 1, 1]               0\n",
      "          Conv2d-204            [-1, 512, 1, 1]       2,359,296\n",
      "     BatchNorm2d-205            [-1, 512, 1, 1]           1,024\n",
      "        BaseConv-206            [-1, 512, 1, 1]               0\n",
      "            ReLU-207            [-1, 512, 1, 1]               0\n",
      "          Conv2d-208           [-1, 2048, 1, 1]       1,048,576\n",
      "     BatchNorm2d-209           [-1, 2048, 1, 1]           4,096\n",
      "        BaseConv-210           [-1, 2048, 1, 1]               0\n",
      "            ReLU-211           [-1, 2048, 1, 1]               0\n",
      "      Bottleneck-212           [-1, 2048, 1, 1]               0\n",
      "          Conv2d-213            [-1, 512, 1, 1]       1,048,576\n",
      "     BatchNorm2d-214            [-1, 512, 1, 1]           1,024\n",
      "        BaseConv-215            [-1, 512, 1, 1]               0\n",
      "            ReLU-216            [-1, 512, 1, 1]               0\n",
      "          Conv2d-217            [-1, 512, 1, 1]       2,359,296\n",
      "     BatchNorm2d-218            [-1, 512, 1, 1]           1,024\n",
      "        BaseConv-219            [-1, 512, 1, 1]               0\n",
      "            ReLU-220            [-1, 512, 1, 1]               0\n",
      "          Conv2d-221           [-1, 2048, 1, 1]       1,048,576\n",
      "     BatchNorm2d-222           [-1, 2048, 1, 1]           4,096\n",
      "        BaseConv-223           [-1, 2048, 1, 1]               0\n",
      "            ReLU-224           [-1, 2048, 1, 1]               0\n",
      "      Bottleneck-225           [-1, 2048, 1, 1]               0\n",
      "AdaptiveAvgPool2d-226           [-1, 2048, 1, 1]               0\n",
      "          Linear-227                   [-1, 10]          20,490\n",
      "================================================================\n",
      "Total params: 23,522,250\n",
      "Trainable params: 23,522,250\n",
      "Non-trainable params: 0\n",
      "----------------------------------------------------------------\n",
      "Input size (MB): 0.00\n",
      "Forward/backward pass size (MB): 6.71\n",
      "Params size (MB): 89.73\n",
      "Estimated Total Size (MB): 96.44\n",
      "----------------------------------------------------------------\n"
     ]
    }
   ],
   "source": [
    "from backbones import ResNet\n",
    "model = ResNet(in_channels = 1, num_classes=10).cuda()\n",
    "config.model = model\n",
    "model.summary((1, 28, 28))"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "outputs": [
    {
     "data": {
      "text/plain": "<Figure size 432x288 with 1 Axes>",
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAOcAAADnCAYAAADl9EEgAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/YYfK9AAAACXBIWXMAAAsTAAALEwEAmpwYAAAHVklEQVR4nO3df6jddR3H8XPv7bZfbqNfmxnJ0Hm9LSvXZrTILjkmjsAQWhKRYxX9Ia3p+gXRH2EQFdIPc8Mg0pm0YBQSYatplyidqNuKgZtZc8s1S7qtH+5Xuzu3v4P7fZ9213Zf99zH409ffO89TJ/7gh++59szNjbWAvL0TvYHAMYnTgglTgglTgglTgj1smpc1bvG/8qF82xHe1vPeP/cnRNCiRNCiRNCiRNCiRNCiRNCiRNCiRNCiRNCiRNCiRNCiRNCiRNCiRNCiRNCiRNCiRNCiRNCiRNCiRNCiRNCiRNCiRNCiRNCiRNCiRNCiRNCiRNCiRNCiRNCla8ApPuMXres3F+49VTj9tsVW8pr37Jzbblfsunl5d43vLvcpxt3TgglTgglTgglTgglTgglTgglTgjlnLPLtIeWlvtd37273Bf3N/8n0e7wu/esuLfcn1l+ptw/vejtHX7D9OLOCaHECaHECaHECaHECaHECaHECaGcc04xp69fXu6f2fy9ch/or5+pbBenmQdOny6v/Ud7RrkvrefWqdXXNG6zhveW17ZPnqx/+BTkzgmhxAmhxAmhxAmhxAmhxAmhHKVMgr558xq3Y+8aLK+9/evfL/d3z3qpw2+f+N/H9x19R7k/snlFuT/6hbvKfcd37mncljzw8fLayz67s9ynIndOCCVOCCVOCCVOCCVOCCVOCCVOCOWccxIcvv91jduT12y6gJ/k7Nyx4Mly335RfQ667uD15b5l0cON27wlI+W13cidE0KJE0KJE0KJE0KJE0KJE0KJE0I55zwPRq9bVu5br25+DV9vq/7qyk7WHVpZ7k89/IZy3/uR5s82fGJmee2Cp06U+++P1s+q9n9puHHr7Skv7UrunBBKnBBKnBBKnBBKnBBKnBBKnBCqZ2xsrHFc1bumeZzG2kNLy/0bWzaX++L+iR8v37j/pnLve9+xcv/be64s95Grmg8UBzY9X147+vzhcu/kJ3/a1bi9cKY+Q/3w2k+Ue9/w7gl9pgthR3vbuH/o7pwQSpwQSpwQSpwQSpwQSpwQSpwQyvOc4+hZ9sZy/+vG+sxtoL9+JnPXqebtFy8tKa8d+cHry/1VR+v3VM5/4PF6L7bR8srza2HfjHIfue14uS9oflQ0ljsnhBInhBInhBInhBInhBInhJqWRym9s2eX++hX/1nujw/+qNyfG/13uW/83Ccbt1f86o/ltQvmvFjuZ8q1e73ttYfK/eCF+Rj/V+6cEEqcEEqcEEqcEEqcEEqcEEqcEGpannOeGKofCfvZYP3Vlp18dMPt5T73webHtibzsSyyuHNCKHFCKHFCKHFCKHFCKHFCKHFCqGl5zvnmL/6m3Hs7/J217tDKcp/14BNn+5FotVr9PX2N2+kOL6Ps6+m+t1W6c0IocUIocUIocUIocUIocUIocUKorj3n/PuHVjRun194Z3ltu9XhFX4/r1/Td2nrsXJnfKfHmr91t91ql9du31f/O7mitXtCn2kyuXNCKHFCKHFCKHFCKHFCKHFCKHFCqK495xyd1bzN763PMXeenFHul91/pP7d5dq9Or33dP+dV3X4Cbsalw8eWF1eObjhuXKfiu8tdeeEUOKEUOKEUOKEUOKEUOKEUF17lHIuRs5cVO6jBw5emA8SptNRyTNfflO573/v3eX+0+PzG7cjmxaX18492vxaxanKnRNCiRNCiRNCiRNCiRNCiRNCiRNCOeccx6ceXVPuA8WjTVNde2hp4/bixhPltfuW1+eYK/feXO5zbjjQuM1tdd85ZifunBBKnBBKnBBKnBBKnBBKnBBKnBCqe885e5qn3g5/J33znVvLfVNrYCKfKMKhO5pfjdhqtVo/vOVrjdtAf/2Vom99Ym25X3LT0+XOf3PnhFDihFDihFDihFDihFDihFDihFDde8451jy1W+3y0qFZI+V+233Lyv3ye+uf3//nfzVufxl6TXntK28+XO7rL32k3FfPrp9F/fGxhY3bLXtvKK999bfnlDtnx50TQokTQokTQokTQokTQokTQnXvUco5mNlT/7HsW3VPuf/62pnl/uypixu3dfMPlteeqw1Hri337Y9d3bhdsWH6fT3lZHLnhFDihFDihFDihFDihFDihFDihFA9Y2PNz1at6l1TPHiVrW/g8sZtYOuh8tqvXLzznH53p6/e7PTIWmXPqfpnf+CXHyv3gXXd+/rCqWpHe9u4X+TqzgmhxAmhxAmhxAmhxAmhxAmhxAmhuvZ5zjO/+0Pj9uyaReW1S9avL/en3/+tiXyk/8ngQ7eW+5Wbj5f7wB7nmN3CnRNCiRNCiRNCiRNCiRNCiRNCiRNCde3znDBVeJ4TphhxQihxQihxQihxQihxQihxQihxQihxQihxQihxQihxQihxQihxQihxQihxQihxQihxQihxQihxQihxQihxQihxQihxQihxQihxQihxQihxQihxQihxQqjyFYDA5HHnhFDihFDihFDihFDihFDihFD/AVyUF3wwoj6+AAAAAElFTkSuQmCC\n"
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "from torch.utils.data import DataLoader\n",
    "from utils import MNISTCLSDataset\n",
    "train_dataset = MNISTCLSDataset(config, mode=\"train\")\n",
    "valid_dataset = MNISTCLSDataset(config, mode=\"validate\")\n",
    "train_dataloader = DataLoader(train_dataset, batch_size=config.train_batch_size, shuffle=True, drop_last=True)\n",
    "valid_dataloader = DataLoader(valid_dataset, batch_size=config.eval_batch_size, shuffle=True, drop_last=True)\n",
    "config.train_dataloader = train_dataloader\n",
    "config.valid_dataloader = valid_dataloader\n",
    "train_dataset.show_image(1)"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "outputs": [],
   "source": [
    "from utils import same_seeds\n",
    "same_seeds(config.seed)"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "09:28:18 - INFO: training start!\n"
     ]
    },
    {
     "data": {
      "text/plain": "HBox(children=(HTML(value='train Epoch [1/10]'), FloatProgress(value=0.0, max=3750.0), HTML(value='')))",
      "application/vnd.jupyter.widget-view+json": {
       "version_major": 2,
       "version_minor": 0,
       "model_id": "3ab95ed4645b47bbacd950cd67abcb86"
      }
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "09:31:32 - INFO: train Epoch [1/10] total_loss:0.1457 acc:11.91\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n"
     ]
    },
    {
     "data": {
      "text/plain": "HBox(children=(HTML(value='valid Epoch [1/10]'), FloatProgress(value=0.0, max=625.0), HTML(value='')))",
      "application/vnd.jupyter.widget-view+json": {
       "version_major": 2,
       "version_minor": 0,
       "model_id": "3374f12113af4956be8289e8c0a99851"
      }
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "09:31:44 - INFO: best model has saved!\n",
      "09:31:44 - INFO: valid Epoch [1/10] total_loss:0.1448 acc:16.52\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n"
     ]
    },
    {
     "data": {
      "text/plain": "HBox(children=(HTML(value='train Epoch [2/10]'), FloatProgress(value=0.0, max=3750.0), HTML(value='')))",
      "application/vnd.jupyter.widget-view+json": {
       "version_major": 2,
       "version_minor": 0,
       "model_id": "53af40aec38847fd9f09119614d3ba6f"
      }
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "09:34:49 - INFO: train Epoch [2/10] total_loss:0.0607 acc:66.25\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n"
     ]
    },
    {
     "data": {
      "text/plain": "HBox(children=(HTML(value='valid Epoch [2/10]'), FloatProgress(value=0.0, max=625.0), HTML(value='')))",
      "application/vnd.jupyter.widget-view+json": {
       "version_major": 2,
       "version_minor": 0,
       "model_id": "90786e97f2b14b7497ffbe5baed824fc"
      }
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "09:35:02 - INFO: best model has saved!\n",
      "09:35:02 - INFO: valid Epoch [2/10] total_loss:0.0278 acc:85.68\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n"
     ]
    },
    {
     "data": {
      "text/plain": "HBox(children=(HTML(value='train Epoch [3/10]'), FloatProgress(value=0.0, max=3750.0), HTML(value='')))",
      "application/vnd.jupyter.widget-view+json": {
       "version_major": 2,
       "version_minor": 0,
       "model_id": "2406180085b6489eb206a0d21949faf1"
      }
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "09:38:07 - INFO: train Epoch [3/10] total_loss:0.0236 acc:87.88\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n"
     ]
    },
    {
     "data": {
      "text/plain": "HBox(children=(HTML(value='valid Epoch [3/10]'), FloatProgress(value=0.0, max=625.0), HTML(value='')))",
      "application/vnd.jupyter.widget-view+json": {
       "version_major": 2,
       "version_minor": 0,
       "model_id": "24029065cef443fb919de19f3f66f0ba"
      }
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "09:38:19 - INFO: best model has saved!\n",
      "09:38:19 - INFO: valid Epoch [3/10] total_loss:0.0189 acc:90.69\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n"
     ]
    },
    {
     "data": {
      "text/plain": "HBox(children=(HTML(value='train Epoch [4/10]'), FloatProgress(value=0.0, max=3750.0), HTML(value='')))",
      "application/vnd.jupyter.widget-view+json": {
       "version_major": 2,
       "version_minor": 0,
       "model_id": "8703f4d7d7974b66a3757a6dc212398b"
      }
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "09:41:27 - INFO: train Epoch [4/10] total_loss:0.0153 acc:92.41\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n"
     ]
    },
    {
     "data": {
      "text/plain": "HBox(children=(HTML(value='valid Epoch [4/10]'), FloatProgress(value=0.0, max=625.0), HTML(value='')))",
      "application/vnd.jupyter.widget-view+json": {
       "version_major": 2,
       "version_minor": 0,
       "model_id": "cc76405dbea84967934270dd6879e813"
      }
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "09:41:40 - INFO: best model has saved!\n",
      "09:41:40 - INFO: valid Epoch [4/10] total_loss:0.0136 acc:93.38\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n"
     ]
    },
    {
     "data": {
      "text/plain": "HBox(children=(HTML(value='train Epoch [5/10]'), FloatProgress(value=0.0, max=3750.0), HTML(value='')))",
      "application/vnd.jupyter.widget-view+json": {
       "version_major": 2,
       "version_minor": 0,
       "model_id": "f6d0e6ec1297488381216162c5203911"
      }
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "09:44:49 - INFO: train Epoch [5/10] total_loss:0.0116 acc:94.18\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n"
     ]
    },
    {
     "data": {
      "text/plain": "HBox(children=(HTML(value='valid Epoch [5/10]'), FloatProgress(value=0.0, max=625.0), HTML(value='')))",
      "application/vnd.jupyter.widget-view+json": {
       "version_major": 2,
       "version_minor": 0,
       "model_id": "a7560417b0174f6797b709be2cd122e1"
      }
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "09:45:01 - INFO: best model has saved!\n",
      "09:45:01 - INFO: valid Epoch [5/10] total_loss:0.0111 acc:94.72\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n"
     ]
    },
    {
     "data": {
      "text/plain": "HBox(children=(HTML(value='train Epoch [6/10]'), FloatProgress(value=0.0, max=3750.0), HTML(value='')))",
      "application/vnd.jupyter.widget-view+json": {
       "version_major": 2,
       "version_minor": 0,
       "model_id": "097cb0cc40b6448c85a622fb771f2452"
      }
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "09:48:08 - INFO: train Epoch [6/10] total_loss:0.0094 acc:95.32\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n"
     ]
    },
    {
     "data": {
      "text/plain": "HBox(children=(HTML(value='valid Epoch [6/10]'), FloatProgress(value=0.0, max=625.0), HTML(value='')))",
      "application/vnd.jupyter.widget-view+json": {
       "version_major": 2,
       "version_minor": 0,
       "model_id": "025d061d532545c4b9064e15b6ed5693"
      }
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "09:48:21 - INFO: best model has saved!\n",
      "09:48:21 - INFO: valid Epoch [6/10] total_loss:0.0105 acc:94.84\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n"
     ]
    },
    {
     "data": {
      "text/plain": "HBox(children=(HTML(value='train Epoch [7/10]'), FloatProgress(value=0.0, max=3750.0), HTML(value='')))",
      "application/vnd.jupyter.widget-view+json": {
       "version_major": 2,
       "version_minor": 0,
       "model_id": "748fb3d46ab24a9d9e0f0b38cd9011f6"
      }
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "09:51:30 - INFO: train Epoch [7/10] total_loss:0.0076 acc:96.18\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n"
     ]
    },
    {
     "data": {
      "text/plain": "HBox(children=(HTML(value='valid Epoch [7/10]'), FloatProgress(value=0.0, max=625.0), HTML(value='')))",
      "application/vnd.jupyter.widget-view+json": {
       "version_major": 2,
       "version_minor": 0,
       "model_id": "5f3581a2ead34f9a9eb78502d18e55af"
      }
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "09:51:42 - INFO: best model has saved!\n",
      "09:51:42 - INFO: valid Epoch [7/10] total_loss:0.0085 acc:95.78\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n"
     ]
    },
    {
     "data": {
      "text/plain": "HBox(children=(HTML(value='train Epoch [8/10]'), FloatProgress(value=0.0, max=3750.0), HTML(value='')))",
      "application/vnd.jupyter.widget-view+json": {
       "version_major": 2,
       "version_minor": 0,
       "model_id": "b5082c8907404d7796d15151b0d6ab03"
      }
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "09:54:55 - INFO: train Epoch [8/10] total_loss:0.0064 acc:96.85\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n"
     ]
    },
    {
     "data": {
      "text/plain": "HBox(children=(HTML(value='valid Epoch [8/10]'), FloatProgress(value=0.0, max=625.0), HTML(value='')))",
      "application/vnd.jupyter.widget-view+json": {
       "version_major": 2,
       "version_minor": 0,
       "model_id": "08062edb5914455f8bf6220864fbc416"
      }
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "09:55:07 - INFO: best model has saved!\n",
      "09:55:07 - INFO: valid Epoch [8/10] total_loss:0.0082 acc:96.15\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n"
     ]
    },
    {
     "data": {
      "text/plain": "HBox(children=(HTML(value='train Epoch [9/10]'), FloatProgress(value=0.0, max=3750.0), HTML(value='')))",
      "application/vnd.jupyter.widget-view+json": {
       "version_major": 2,
       "version_minor": 0,
       "model_id": "d96a93430b474fe5800acdd2c8f9140d"
      }
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "09:58:18 - INFO: train Epoch [9/10] total_loss:0.0055 acc:97.28\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n"
     ]
    },
    {
     "data": {
      "text/plain": "HBox(children=(HTML(value='valid Epoch [9/10]'), FloatProgress(value=0.0, max=625.0), HTML(value='')))",
      "application/vnd.jupyter.widget-view+json": {
       "version_major": 2,
       "version_minor": 0,
       "model_id": "05c4bc16c0984025b48fb533854d6262"
      }
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "09:58:30 - INFO: valid Epoch [9/10] total_loss:0.0082 acc:96.05\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n"
     ]
    },
    {
     "data": {
      "text/plain": "HBox(children=(HTML(value='train Epoch [10/10]'), FloatProgress(value=0.0, max=3750.0), HTML(value='')))",
      "application/vnd.jupyter.widget-view+json": {
       "version_major": 2,
       "version_minor": 0,
       "model_id": "7cd4a95c23644595bc6366781b876eda"
      }
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "10:01:39 - INFO: train Epoch [10/10] total_loss:0.0052 acc:97.44\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n"
     ]
    },
    {
     "data": {
      "text/plain": "HBox(children=(HTML(value='valid Epoch [10/10]'), FloatProgress(value=0.0, max=625.0), HTML(value='')))",
      "application/vnd.jupyter.widget-view+json": {
       "version_major": 2,
       "version_minor": 0,
       "model_id": "3699e4710a58438a94f93cffd385f458"
      }
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "10:01:51 - INFO: valid Epoch [10/10] total_loss:0.0078 acc:96.1\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "training end! total time:33.55889135599136mins\n"
     ]
    },
    {
     "data": {
      "text/plain": "<Figure size 576x576 with 2 Axes>",
      "image/png": "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\n"
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "from utils import Classification\n",
    "cls = Classification(config)\n",
    "cls.train()"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "outputs": [
    {
     "data": {
      "text/plain": "HBox(children=(HTML(value='valid Epoch [1/10]'), FloatProgress(value=0.0, max=625.0), HTML(value='')))",
      "application/vnd.jupyter.widget-view+json": {
       "version_major": 2,
       "version_minor": 0,
       "model_id": "3be87752b0934daa96e7406f596174b4"
      }
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "10:05:55 - INFO: valid Epoch [1/10] total_loss:0.0081 acc:96.07\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n"
     ]
    }
   ],
   "source": [
    "cls.eval()"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "outputs": [],
   "source": [],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 0
}